Reactμ λμμ± κΈ°λ₯μΈ useTransition λ° useDeferredValueλ₯Ό νμ©νμ¬ μ±λ₯μ μ΅μ ννκ³ λμ± λΆλλ½κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡νμΈμ. μ€μ μμ μ λͺ¨λ² μ¬λ‘λ₯Ό ν΅ν΄ λ°°μ°μΈμ.
React Concurrent Features: ν₯μλ μ¬μ©μ κ²½νμ μν useTransition λ° useDeferredValue λ§μ€ν°νκΈ°
React 18μ μ ν리μΌμ΄μ
μ λ°μμ±κ³Ό μΈμ§λ μ±λ₯μ ν₯μμν€κΈ° μν΄ μ€κ³λ κ°λ ₯ν λꡬ μΈνΈμΈ λμμ± κΈ°λ₯μ λμ
νμ΅λλ€. μ΄ μ€μμλ useTransitionκ³Ό useDeferredValueλ μν μ
λ°μ΄νΈλ₯Ό κ΄λ¦¬νκ³ λ λλ§ μ°μ μμλ₯Ό μ§μ νλ λ° νμμ μΈ ν
μΌλ‘ λ보μ
λλ€. μ΄ κ°μ΄λλ μ΄λ¬ν κΈ°λ₯μ λν ν¬κ΄μ μΈ νꡬλ₯Ό μ 곡νλ©°, μ΄λ₯Ό ν΅ν΄ React μ ν리μΌμ΄μ
μ λμ± λΆλλ½κ³ μ¬μ©μ μΉνμ μΈ κ²½νμΌλ‘ λ³νμν¬ μ μλ λ°©λ²μ 보μ¬μ€λλ€.
Reactμ λμμ± μ΄ν΄
useTransitionκ³Ό useDeferredValueμ ꡬ체μ μΈ λ΄μ©μΌλ‘ λ€μ΄κ°κΈ° μ μ Reactμ λμμ± κ°λ
μ νμ
νλ κ²μ΄ μ€μν©λλ€. λμμ±μ ν΅ν΄ Reactλ λ λλ§ μμ
μ μ€λ¨, μΌμ μ€μ§, μ¬κ° λλ ν¬κΈ°ν μλ μμ΅λλ€. μ¦, Reactλ λ κΈ΄κΈν μ
λ°μ΄νΈ (μ: ν° λͺ©λ‘ μ
λ°μ΄νΈ)λ³΄λ€ μ€μν μ
λ°μ΄νΈ (μ: μ
λ ₯ νλμ μ
λ ₯)μ μ°μ μμλ₯Ό μ§μ ν μ μμ΅λλ€. μ΄μ μλ Reactκ° λκΈ°μ, μ°¨λ¨ λ°©μμΌλ‘ μλνμ΅λλ€. Reactκ° μ
λ°μ΄νΈλ₯Ό μμνλ©΄ λ€λ₯Έ μμ
μ μννκΈ° μ μ μλ£ν΄μΌ νμ΅λλ€. μ΄λ‘ μΈν΄ νΉν 볡μ‘ν μν μ
λ°μ΄νΈ μ€μ μ§μ°κ³Ό λλ¦° μ¬μ©μ μΈν°νμ΄μ€κ° λ°μν μ μμ΅λλ€.
λμμ±μ Reactκ° μ¬λ¬ μ λ°μ΄νΈλ₯Ό λμμ μ²λ¦¬νμ¬ λ³λ ¬ μ²λ¦¬μ νμμ ν¨κ³Όμ μΌλ‘ λ§λ€μ΄ λμΌλ‘μ¨ μ΄λ₯Ό κ·Όλ³Έμ μΌλ‘ λ³κ²½ν©λλ€. μ΄λ μ€μ λ©ν° μ€λ λ© μμ΄ μ κ΅ν μ€μΌμ€λ§ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ λ¬μ±λ©λλ€.
useTransition μκ°: μ λ°μ΄νΈλ₯Ό λΉμ°¨λ¨μΌλ‘ νμ
useTransition ν
μ μ¬μ©νλ©΄ νΉμ μν μ
λ°μ΄νΈλ₯Ό transitionsλ‘ μ§μ ν μ μμ΅λλ€. Transitionsλ Reactκ° μ°μ μμκ° λμ μ
λ°μ΄νΈκ° λκΈ° μ€μΈ κ²½μ° μ€λ¨νκ±°λ μ§μ°ν μ μλ κΈ΄κΈνμ§ μμ μ
λ°μ΄νΈμ
λλ€. μ΄λ κ² νλ©΄ 볡μ‘ν μμ
μ€ UIκ° λ©μΆκ±°λ μλ΅νμ§ μλ λλμ΄ λ€μ§ μμ΅λλ€.
useTransitionμ κΈ°λ³Έ μ¬μ©λ²
useTransition ν
μ λ κ°μ μμλ₯Ό ν¬ν¨νλ λ°°μ΄μ λ°νν©λλ€.
isPending: transitionμ΄ νμ¬ μ§ν μ€μΈμ§ μ¬λΆλ₯Ό λνλ΄λ λΆμΈ κ°μ λλ€.startTransition: transitionμΌλ‘ νμνλ €λ μν μ λ°μ΄νΈλ₯Ό λννλ ν¨μμ λλ€.
κ°λ¨ν μλ λ€μκ³Ό κ°μ΅λλ€.
import { useState, useTransition } from 'react';
function MyComponent() {
const [isPending, startTransition] = useTransition();
const [value, setValue] = useState('');
const handleChange = (e) => {
startTransition(() => {
setValue(e.target.value);
});
};
return (
{isPending ? Updating...
: Value: {value}
}
);
}
μ΄ μμμ setValue ν¨μλ startTransitionμΌλ‘ λνλ©λλ€. μ΄λ Reactμκ² value μνλ₯Ό μ
λ°μ΄νΈνλ κ²μ΄ transitionμμ μλ €μ€λλ€. μ
λ°μ΄νΈκ° μ§νλλ λμ isPendingμ trueκ° λμ΄ λ‘λ© νμκΈ° λλ κΈ°ν μκ°μ νΌλλ°±μ νμν μ μμ΅λλ€.
μ€μ©μ μΈ μ: λκ·λͺ¨ λ°μ΄ν° μΈνΈ νν°λ§
μ¬μ©μ μ
λ ₯μ κΈ°λ°μΌλ‘ λκ·λͺ¨ λ°μ΄ν° μΈνΈλ₯Ό νν°λ§ν΄μΌ νλ μλ리μ€λ₯Ό κ³ λ €νμμμ€. useTransitionμ΄ μμΌλ©΄ κ° ν€ μ
λ ₯μ΄ μ 체 λͺ©λ‘μ λ€μ λ λλ§μ νΈλ¦¬κ±°νμ¬ λμ λλ μ§μ°κ³Ό μ΄μ
ν μ¬μ©μ κ²½νμ μ΄λν μ μμ΅λλ€.
import { useState, useTransition, useMemo } from 'react';
const data = Array.from({ length: 10000 }, (_, i) => `Item ${i + 1}`);
function FilterableList() {
const [filterText, setFilterText] = useState('');
const [isPending, startTransition] = useTransition();
const filteredData = useMemo(() => {
return data.filter(item => item.toLowerCase().includes(filterText.toLowerCase()));
}, [filterText]);
const handleChange = (e) => {
startTransition(() => {
setFilterText(e.target.value);
});
};
return (
{isPending && Filtering...
}
{filteredData.map(item => (
- {item}
))}
);
}
μ΄ κ°μ λ μμμ useTransitionμ νν°λ§ νλ‘μΈμ€κ° μ§νλλ λμ UIκ° μλ΅μ±μ μ μ§νλλ‘ λ³΄μ₯ν©λλ€. isPending μνλ₯Ό μ¬μ©νλ©΄ "νν°λ§ μ€..." λ©μμ§λ₯Ό νμνμ¬ μ¬μ©μμκ² μκ°μ νΌλλ°±μ μ 곡ν μ μμ΅λλ€. useMemoλ νν°λ§ νλ‘μΈμ€ μ체λ₯Ό μ΅μ ννμ¬ λΆνμν λ€μ κ³μ°μ λ°©μ§νλ λ° μ¬μ©λ©λλ€.
νν°λ§μ λν κ΅μ μ κ³ λ € μ¬ν
κ΅μ λ°μ΄ν°λ₯Ό μ²λ¦¬ ν λλ νν°λ§ λ‘μ§μ΄ λ‘μΌμΌμ μΈμνλμ§ νμΈνμμμ€. μλ₯Ό λ€μ΄, μΈμ΄λ§λ€ λμλ¬Έμλ₯Ό ꡬλΆνμ§ μλ λΉκ΅μ λν κ·μΉμ΄ λ€λ¦
λλ€. μ΄λ¬ν μ°¨μ΄μ μ μ¬λ°λ₯΄κ² μ²λ¦¬νλ €λ©΄ μ μ ν λ‘μΌμΌ μ€μ κ³Ό ν¨κ» toLocaleLowerCase() λ° toLocaleUpperCase()μ κ°μ λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. μ
μΌνΈ λΆνΈ λλ λ°μ κ΅¬λ³ λΆνΈμ κ΄λ ¨λ λ 볡μ‘ν μλ리μ€μ κ²½μ° κ΅μ ν (i18n)λ₯Ό μν΄ νΉλ³ν μ€κ³λ λΌμ΄λΈλ¬λ¦¬κ° νμν μ μμ΅λλ€.
useDeferredValue μκ°: λ μ€μν μ λ°μ΄νΈ μ°κΈ°
useDeferredValue ν
μ κ°μ λ λλ§μ μ°κΈ°νμ¬ μ
λ°μ΄νΈμ μ°μ μμλ₯Ό μ§μ νλ λ λ€λ₯Έ λ°©λ²μ μ 곡ν©λλ€. Reactκ° μ°μ μμκ° λμ μμ
μ μν ν νμκ° μμ λλ§ μ
λ°μ΄νΈλλ κ°μ μ§μ°λ λ²μ μ λ§λ€ μ μμ΅λλ€. μ΄λ κ°μ μ
λ°μ΄νΈκ° UIμ μ¦μ λ°μ ν νμκ°μλ λΉμ©μ΄ λ§μ΄ λλ λ€μ λ λλ§μ νΈλ¦¬κ±° ν λ νΉν μ μ©ν©λλ€.
useDeferredValueμ κΈ°λ³Έ μ¬μ©λ²
useDeferredValue ν
μ κ°μ μ
λ ₯μΌλ‘ μ¬μ©νκ³ ν΄λΉ κ°μ μ§μ°λ λ²μ μ λ°νν©λλ€. Reactλ μ§μ°λ κ°μ΄ κ²°κ΅ μ΅μ κ°κ³Ό μΌμΉνλλ‘ λ³΄μ₯νμ§λ§ νλμ΄ λ§μ κΈ°κ° λμ μ§μ° λ μ μμ΅λλ€.
import { useState, useDeferredValue } from 'react';
function MyComponent() {
const [value, setValue] = useState('');
const deferredValue = useDeferredValue(value);
const handleChange = (e) => {
setValue(e.target.value);
};
return (
Value: {deferredValue}
);
}
μ΄ μμμ deferredValueλ value μνμ μ§μ°λ λ²μ μ
λλ€. valueμ λν λ³κ²½ μ¬νμ κ²°κ΅ deferredValueμ λ°μλμ§λ§ Reactλ λ€λ₯Έ μμ
μΌλ‘ λ°μ κ²½μ° μ
λ°μ΄νΈλ₯Ό μ§μ° ν μ μμ΅λλ€.
μ€μ©μ μΈ μ: μ§μ°λ κ²°κ³Όκ° μλ μλ μμ±
μ¬μ©μ μ
λ ₯μ κΈ°λ°μΌλ‘ μ μ λͺ©λ‘μ νμνλ μλ μμ± κΈ°λ₯μ κ³ λ €νμμμ€. νΉν λͺ©λ‘μ΄ ν¬κ±°λ μ μμ΄ μ격 μλ²μμ κ°μ Έμ¨ κ²½μ° λͺ¨λ ν€ μ
λ ₯μμ μ μ λͺ©λ‘μ μ
λ°μ΄νΈνλ λ° κ³μ° λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€. useDeferredValueλ₯Ό μ¬μ©νλ©΄ μ
λ ₯ νλ μ체 (μ¦κ°μ μΈ μ¬μ©μ νΌλλ°±) μ
λ°μ΄νΈμ μ°μ μμλ₯Ό μ§μ νλ©΄μ μ μ λͺ©λ‘ μ
λ°μ΄νΈλ₯Ό μ°κΈ° ν μ μμ΅λλ€.
import { useState, useDeferredValue, useEffect } from 'react';
function Autocomplete() {
const [inputValue, setInputValue] = useState('');
const deferredInputValue = useDeferredValue(inputValue);
const [suggestions, setSuggestions] = useState([]);
useEffect(() => {
// Simulate fetching suggestions from an API
const fetchSuggestions = async () => {
// Replace with your actual API call
await new Promise(resolve => setTimeout(resolve, 200)); // Simulate network latency
const mockSuggestions = Array.from({ length: 5 }, (_, i) => `Suggestion for ${deferredInputValue} ${i + 1}`);
setSuggestions(mockSuggestions);
};
fetchSuggestions();
}, [deferredInputValue]);
const handleChange = (e) => {
setInputValue(e.target.value);
};
return (
{suggestions.map(suggestion => (
- {suggestion}
))}
);
}
μ΄ μμμ useEffect ν
μ deferredInputValueλ₯Ό κΈ°λ°μΌλ‘ μ μμ κ°μ Έμ΅λλ€. μ΄λ₯Ό ν΅ν΄ Reactκ° μ
λ ₯ νλ μ
λ°μ΄νΈμ κ°μ μ°μ μμκ° λμ μ
λ°μ΄νΈ μ²λ¦¬λ₯Ό μλ£ ν νμλ§ μ μ λͺ©λ‘μ΄ μ
λ°μ΄νΈλλλ‘ λ³΄μ₯ν©λλ€. μ μ λͺ©λ‘μ΄ μ
λ°μ΄νΈλλ λ° μκ°μ΄ 걸리λλΌλ μ¬μ©μλ λΆλλ¬μ΄ μ
λ ₯ κ²½νμ κ²½ννκ²λ©λλ€.
μλ μμ±μ λν κΈλ‘λ² κ³ λ € μ¬ν
μλ μμ± κΈ°λ₯μ μ μΈκ³ μ¬μ©μλ₯Ό μΌλμλκ³ μ€κ³ν΄μΌν©λλ€. μ£Όμ κ³ λ € μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
- μΈμ΄ μ§μ: μλ μμ±μ΄ μ¬λ¬ μΈμ΄μ λ¬Έμ μΈνΈλ₯Ό μ§μνλμ§ νμΈνμμμ€. μ λ μ½λλ₯Ό μΈμνλ λ¬Έμμ΄ μ‘°μ ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
- μ λ ₯ λ°©λ² νΈμ§κΈ° (IME): μΌλΆ μ§μμ μ¬μ©μλ νμ€ ν€λ³΄λμμ μ§μ μ¬μ©ν μμλ λ¬Έμλ₯Ό μ λ ₯νκΈ° μν΄ IMEμ μμ‘΄νλ―λ‘ IMEμμ μ λ ₯μ μ¬λ°λ₯΄κ² μ²λ¦¬νμμμ€.
- μ€λ₯Έμͺ½μμ μΌμͺ½ (RTL) μΈμ΄: UI μμμ ν μ€νΈ λ°©ν₯μ μ¬λ°λ₯΄κ² λ―Έλ¬λ§νμ¬ μλμ΄ λ° νλΈλ¦¬μ΄μ κ°μ RTL μΈμ΄λ₯Ό μ§μν©λλ€.
- λ€νΈμν¬ λκΈ° μκ°: μ§μ μμΉκ° λ€λ₯Έ μ¬μ©μλ λ€μν μμ€μ λ€νΈμν¬ λκΈ° μκ°μ κ²½ννκ²λ©λλ€. API νΈμΆ λ° λ°μ΄ν° μ μ‘μ μ΅μ ννμ¬ μ§μ°μ μ΅μννκ³ λͺ νν λ‘λ© νμκΈ°λ₯Ό μ 곡νμμμ€. CDN (μ½ν μΈ μ μ‘ λ€νΈμν¬)μ μ¬μ©νμ¬ μ μ μμ°μ μ¬μ©μμκ² λ κ°κΉκ² μΊμνλ κ²μ΄ μ’μ΅λλ€.
- λ¬Ένμ κ°μμ±: μ¬μ©μμ μ λ ₯μ κΈ°λ°μΌλ‘ λΆμΎνκ±°λ λΆμ μ ν μ©μ΄λ₯Ό μ μνμ§ λ§μμμ€. κΈμ μ μΈ μ¬μ©μ κ²½νμ 보μ₯νκΈ° μν΄ μ½ν μΈ νν°λ§ λ° μ‘°μ λ©μ»€λμ¦μ ꡬννμμμ€.
useTransition λ° useDeferredValue κ²°ν©
useTransitionκ³Ό useDeferredValueλ₯Ό ν¨κ» μ¬μ©νλ©΄ λ λλ§ μ°μ μμλ₯Όλ³΄λ€ μΈλ°νκ² μ μ΄ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ useTransitionμ μ¬μ©νμ¬ μν μ
λ°μ΄νΈλ₯Ό κΈ΄κΈνμ§ μμ κ²μΌλ‘ νμ ν λ€μ useDeferredValueλ₯Ό μ¬μ©νμ¬ ν΄λΉ μνμ μμ‘΄νλ νΉμ κ΅¬μ± μμμ λ λλ§μ μ°κΈ° ν μ μμ΅λλ€.
μ¬λ¬ κ°μ μνΈ μ°κ²°λ κ΅¬μ± μμκ°μλ 볡μ‘ν λμ 보λλ₯Ό μμν΄λ³΄μμμ€. μ¬μ©μκ° νν°λ₯Ό λ³κ²½νλ©΄ νμλλ λ°μ΄ν°λ₯Ό μ λ°μ΄νΈ (transition)νκ³ λ λλ§νλ λ° μκ°μ΄ μ€λ 걸리λ μ°¨νΈ κ΅¬μ± μμμ λ€μ λ λλ§μ μ°κΈ°νλ €κ³ ν©λλ€. μ΄λ κ²νλ©΄ λμ 보λμ λ€λ₯Έ λΆλΆμ΄ λΉ λ₯΄κ² μ λ°μ΄νΈλκ³ μ°¨νΈκ° μ μ§μ μΌλ‘ λ°λΌ μ‘μ μ μμ΅λλ€.
useTransition λ° useDeferredValue μ¬μ©μ λν λͺ¨λ² μ¬λ‘
- μ±λ₯ λ³λͺ© νμ μλ³: React DevToolsλ₯Ό μ¬μ©νμ¬ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν€λ κ΅¬μ± μμ λλ μν μ λ°μ΄νΈλ₯Ό μλ³νμμμ€.
- μ¬μ©μ μνΈ μμ© μ°μ μμ μ§μ : μ λ ₯ λλ ν΄λ¦κ³Ό κ°μ μ§μ μ μΈ μ¬μ©μ μνΈ μμ©μ΄ νμ μ°μ μμκ° μ§μ λλλ‘νμμμ€.
- μκ°μ νΌλλ°± μ 곡:
useTransitionμisPendingμνλ₯Ό μ¬μ©νμ¬ μ λ°μ΄νΈκ° μ§ν μ€μΌ λ μ¬μ©μμκ² μκ°μ νΌλλ°±μ μ 곡νμμμ€. - μΈ‘μ λ° λͺ¨λν°λ§:
useTransitionκ³ΌuseDeferredValueκ° μ¬μ©μ κ²½νμ ν¨κ³Όμ μΌλ‘ κ°μ νκ³ μλμ§ νμΈνκΈ° μν΄ μ ν리μΌμ΄μ μ μ±λ₯μ μ§μμ μΌλ‘ λͺ¨λν°λ§νμμμ€. - κ³Όμ©νμ§ λ§μμμ€: νμν κ²½μ°μλ§ μ΄λ¬ν ν μ μ¬μ©νμμμ€. κ³Όμ©νλ©΄ μ½λκ° λ 볡μ‘ν΄μ§κ³ μΆλ‘ νκΈ°κ° λ μ΄λ €μ μ§ μ μμ΅λλ€.
- μ ν리μΌμ΄μ νλ‘νμΌλ§: React νλ‘νμΌλ¬λ₯Ό μ¬μ©νμ¬ μ΄λ¬ν ν μ΄ μ ν리μΌμ΄μ μ±λ₯μ λ―ΈμΉλ μν₯μ μ΄ν΄νμμμ€. μ΄λ κ²νλ©΄ μ¬μ©λμ λ―ΈμΈ μ‘°μ νκ³ μΆκ° μ΅μ νλ₯Όμν μ μ¬μ μμμ μλ³νλ λ° λμμ΄λ©λλ€.
κ²°λ‘
useTransitionκ³Ό useDeferredValueλ React μ ν리μΌμ΄μ
μ μ±λ₯κ³Ό μλ΅μ±μ ν₯μμν€λ κ°λ ₯ν λꡬμ
λλ€. μ΄λ¬ν ν
μ ν¨κ³Όμ μΌλ‘ μ¬μ©νλ λ°©λ²μ μ΄ν΄ν¨μΌλ‘μ¨ λ³΅μ‘ν μν μ
λ°μ΄νΈμ λκ·λͺ¨ λ°μ΄ν° μΈνΈλ₯Ό μ²λ¦¬ ν λλ λμ± λΆλλ½κ³ μ¬μ©μ μΉνμ μΈ κ²½νμ λ§λ€ μ μμ΅λλ€. μ¬μ©μ μνΈ μμ©μ μ°μ μμλ₯Ό μ§μ νκ³ μκ°μ νΌλλ°±μ μ 곡νλ©° μ ν리μΌμ΄μ
μ μ±λ₯μ μ§μμ μΌλ‘ λͺ¨λν°λ§νλ κ²μ μμ§ λ§μμμ€. μ΄λ¬ν λμμ± κΈ°λ₯μ μμ©ν¨μΌλ‘μ¨ React κ°λ° κΈ°μ μ ν λ¨κ³ λμ΄ μ¬λ¦¬κ³ μ μΈκ³ μμ²μλ₯Ό μν΄ μ§μ μΌλ‘ λ°μ΄λ μΉ μ ν리μΌμ΄μ
μ κ΅¬μΆ ν μ μμ΅λλ€.